From d7898ce61af47522d8e757712167316fa71caf54 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 26 Mar 2008 13:21:42 +0000 Subject: [PATCH] xenstored: Delay forking until after listening sockets are opened. Also, in startup xend script, delay further startup until xenstored initial child process has exited. This serialises xenstored startup with that of other daemons (e.g., xenconsoled). Signed-off-by: Bastian Blank --- tools/misc/xend | 16 +++++++++++----- tools/xenstore/xenstored_core.c | 25 +++++++++++++------------ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/tools/misc/xend b/tools/misc/xend index 7cb617630d..15e9b8a53f 100644 --- a/tools/misc/xend +++ b/tools/misc/xend @@ -95,11 +95,17 @@ def start_xenstored(): f.close() except: pass - XENSTORED_TRACE = os.getenv("XENSTORED_TRACE") - cmd = "xenstored --pid-file /var/run/xenstore.pid" - if XENSTORED_TRACE: - cmd += " -T /var/log/xen/xenstored-trace.log" - s,o = commands.getstatusoutput(cmd) + args = ['xenstored', "--pid-file", pidfname] + if os.getenv("XENSTORED_TRACE"): + args.extend(["-T", "/var/log/xen/xenstored-trace.log"]) + pid = os.fork() + if pid == 0: + os.execvp('xenstored', args) + p, status = os.waitpid(pid, 0) + if os.WIFEXITED(status): + status = os.WEXITSTATUS(status) + if status: + raise RuntimeError("Failed to start xenstored: %d" % status) def start_consoled(): if os.fork() == 0: diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index a643f2d969..37ceab8493 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -1839,13 +1839,6 @@ int main(int argc, char *argv[]) } } - if (dofork) { - openlog("xenstored", 0, LOG_DAEMON); - daemonize(); - } - if (pidfile) - write_pidfile(pidfile); - /* Talloc leak reports go to stderr, which is closed if we fork. */ if (!dofork) talloc_enable_leak_report_full(); @@ -1899,16 +1892,21 @@ int main(int argc, char *argv[]) /* Restore existing connections. */ restore_existing_connections(); - if (outputpid) { - printf("%ld\n", (long)getpid()); - fflush(stdout); - } - /* redirect to /dev/null now we're ready to accept connections */ if (dofork) { int devnull = open("/dev/null", O_RDWR); if (devnull == -1) barf_perror("Could not open /dev/null\n"); + + openlog("xenstored", 0, LOG_DAEMON); + + daemonize(); + + if (outputpid) { + printf("%ld\n", (long)getpid()); + fflush(stdout); + } + dup2(devnull, STDIN_FILENO); dup2(devnull, STDOUT_FILENO); dup2(devnull, STDERR_FILENO); @@ -1916,6 +1914,9 @@ int main(int argc, char *argv[]) xprintf = trace; } + if (pidfile) + write_pidfile(pidfile); + signal(SIGHUP, trigger_reopen_log); if (xce_handle != -1) -- 2.30.2